package com.easy.framework.web.i18n;

import com.easy.framework.common.utils.Func;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * 该类是一个自定义的拦截器，用于从HTTP请求的头部获取语言参数，并根据该参数设置当前请求的语言。
 * 它继承自Spring的`LocaleChangeInterceptor`，并重写了`preHandle`方法来实现自定义的语言切换逻辑。
 */
public class CustomLocaleChangeInterceptor extends LocaleChangeInterceptor {

    // 设置请求头中获取语言的字段名
    private static final String LANG_HEADER = "Accept-Language";

    /**
     * 这个方法会在每个请求处理之前被调用，用来获取请求头中的语言设置，
     * 如果存在有效的语言参数，就会设置当前请求的语言环境。
     * @param request  当前的HTTP请求对象
     * @param response 当前的HTTP响应对象
     * @param handler  当前请求的处理器（一般是控制器方法）
     * @return 如果返回true，表示继续执行后续的处理器链，否则会中断请求的处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        // 从请求头中获取指定的语言字段（"lang"）
        String lang = request.getHeader(LANG_HEADER);
        // 如果lang参数存在且不为空
        if (Func.isNotEmpty(lang)) {
            // 按照"-"分割语言和地区信息
            String[] parts = lang.split("_");

            // 设置语言环境
            // parts[0]是语言（例如：en、zh）
            // parts[1]是地区（例如：US、CN），如果没有地区则使用空字符串
            LocaleContextHolder.setLocale(new Locale(parts[0], parts.length > 1 ? parts[1] : ""));
        }

        // 返回true放行
        return true;
    }
}
